/*
 * Comunicador.cpp
 *
 *  PEREIRA, FERNANDO ROQUE
 *  91610
 */

#include "client_Comunicador.h"

Comunicador::Comunicador() {}

Comunicador::~Comunicador() {}

int Comunicador::conectar(int numeroPuerto, const char* ip) {
	// Lleno estructura para saber a donde enviar y recibir mensajes
	this->socket.setAddr_in(numeroPuerto, ip);
	return (this->socket.connectSocket());
}

int Comunicador::enviarMensaje(const char* message, unsigned int len) {
	return (this->socket.sendMessage(message, len));
}

int Comunicador::recibirMensaje(std::string& buffer) {
	// Puedo tener algun mensaje guardado en el buffer de mensajes --> lo devuelvo
	buffer.clear();
	if (!(this->bufferMensajes.empty())) {
		buffer = this->bufferMensajes.front();
		this->bufferMensajes.pop();
		return 0;
	}
	int retorno = 0;
	do {
		char* buf = new char[Socket::tamBuffer + 1];
		retorno = this->socket.receiveMessage((void*)buf);
		if (retorno == -1 || retorno == 0) {
			delete [] buf;
			return retorno;
		}
		buf[retorno] = '\0';
		// Concateno a un string general lo que recibo desde el server
		buffer += buf;
		delete [] buf;
		buf = NULL;
	// Ultimo caracter == \n. Seguir recibiendo hasta llegar a dicho caracter!
	} while(buffer[buffer.length() - 1] != '\n');

	size_t pos = 0, posAnterior = 0;
	pos = buffer.find('\n', pos);
	// Mientras siga encontrando caracteres de fin de mensaje, pushea a la cola
	while(pos != std::string::npos) {
		pos++;
		std::string aux = buffer.substr(posAnterior, pos - posAnterior);
		this->bufferMensajes.push(aux);
		posAnterior = pos;
		pos = buffer.find('\n', pos);
	}

	// Recupero el primer mensaje de la cola (pudieron haber llegado varios)
	buffer = this->bufferMensajes.front();
	this->bufferMensajes.pop();

	return 0;
}

int Comunicador::cerrarComunicacion() {
	return (this->socket.cerrarSocket());
}

bool Comunicador::hayMensajesGuardados() {
	return (!(this->bufferMensajes.empty()));
}
